package com.algorithm.ch1.cjm.design;

import java.util.Arrays;
import java.util.Random;

/**
 * 打乱一个没有重复元素的数组。
 * <p>
 * 示例:
 * <p>
 * // 以数字集合 1, 2 和 3 初始化数组。
 * int[] nums = {1,2,3};
 * Solution solution = new Solution(nums);
 * <p>
 * // 打乱数组 [1,2,3] 并返回结果。任何 [1,2,3]的排列返回的概率应该相同。
 * solution.shuffle();
 * <p>
 * // 重设数组到它的初始状态[1,2,3]。
 * solution.reset();
 * <p>
 * // 随机返回数组[1,2,3]打乱后的结果。
 * solution.shuffle();
 */
public class Shuffle {

    private int[] origin;

    private static Random random = new Random();

    /**
     * 考虑使用数据结构完成
     * @param nums
     */
    public Shuffle(int[] nums) {

        this.origin = nums;
    }

    /** Resets the array to its original configuration and return it. */
    public int[] reset() {
        return origin;
    }

    /** Returns a random shuffling of the array. */
    public int[] shuffle() {

        int[] copy = origin.clone();

        for (int i = copy.length - 1; i >= 0; i--) {

            //是生成一个介于[0,n)的区间int值，包含0而不包含n。
            int index = random.nextInt(copy.length);
            int temp = copy[index];

            copy[index] = copy[i];
            copy[i] = temp;
        }

        return copy;
    }

    public static void main(String[] args) {

        int[] nums = new int[]{1, 2, 3, 4, 5, 6, 7, 8};
        Shuffle obj = new Shuffle(nums);

        int[] param2 = obj.shuffle();

        System.out.println(Arrays.toString(param2));

        int[] param1 = obj.reset();

        System.out.println(Arrays.toString(param1));
    }


}
